﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
#include <string>

//引入智能指针的原因

//double Divide(int a, int b)
//{
//	//当b为0时抛出异常
//	if (b == 0)
//	{
//		throw "Divide by zero condition!";
//	}
//	else
//	{
//		return double(a) / double(b);
//	}
//}
//
//void Func()
//{
//	int* arr1 = new int[10];
//	int* arr2 = new int[10];
//
//	try
//	{
//		//当发生除0错误时抛出异常 但是要注意释放arr1与arr2 因此需要先捕获释放后再重新抛出异常
//		//但是如果在new的时候发生异常呢  对于arr2 如果在new的时候发生异常 那么这时候又要套一层捕获释放逻辑
//		//这样显得很混乱 于是提出智能指针来解决这个问题
//		int len, time;
//		cin >> len >> time;
//		cout << Divide(len, time) << endl;
//	}
//	catch (...)
//	{
//		cout << "delete []" << arr1 << endl;
//		cout << "delete []" << arr2 << endl;
//		delete[] arr1;
//		delete[] arr2;
//		throw; // 异常重新抛出，捕获到什么抛出什么
//	}
//
//	cout << "delete []" << arr1 << endl;
//	delete[] arr1;
//	cout << "delete []" << arr2 << endl;
//	delete[] arr2;
//}

//int main()
//{
//	try
//	{
//		Func();
//	}
//	catch (const char* errmsg)
//	{
//		cout << errmsg << endl;
//	}
//	catch (const exception& e)
//	{
//		cout << e.what() << endl;
//	}
//	catch (...)
//	{
//		cout << "未知异常" << endl;
//	}
//	return 0;
//}


//RAII和智能指针的设计思路
/*
RAII是Resource Acquisition Is Initialization的缩写，
他是⼀种管理资源的类的设计思想，
本质是⼀种利⽤对象⽣命周期来管理获取到的动态资源，避免资源泄漏
*/

/*
RAII在获取资源时把资源委托给⼀个对象，接着控制对资源的访问，
资源在对象的⽣命周期内始终保持有效，最后在对象析构的时候释放资源，
这样保障了资源的正常释放，避免资源泄漏问题。
*/


/*
智能指针类除了满⾜RAII的设计思路，还要⽅便资源的访问，所以智能指针类还会想迭代器类⼀
样，重载 operator* /operator-> / operator[] 等运算符，⽅便访问资源。
*/


template<class T>
class SmartPtr
{
public:
	SmartPtr(T* ptr)
		:_ptr(ptr)
	{}

	~SmartPtr()
	{
		delete[] _ptr;
	}

	//重载运算符
	T& operator*()
	{
		return *_ptr;
	}

	T* operator->()
	{
		return _ptr;
	}

	T& operator[](size_t i)
	{
		return _ptr[i];
	}
private:
	T* _ptr;
};

double Divide(int a, int b)
{
	// 当b == 0时抛出异常
	if (b == 0)
	{
		throw "Divide by zero condition!";
	}
	else
	{
		return (double)a / (double)b;
	}
}

void Func()
{
	//使用智能指针来管理new出来的数组以后代码将会简洁很多
	SmartPtr<int> sp1 = new int[10];
	SmartPtr<int> sp2 = new int[10];
	//SmartPtr<int> sp3(sp1);

	for (size_t i = 0; i < 10; i++)
	{
		sp1[i] = sp2[i] = i+1;
		cout << "sp1:" << sp1[i] << " " << "sp2:" << sp2[i] << endl;
	}
	int len, time;
	cin >> len >> time;
	cout << Divide(len, time) << endl;
}

int main()
{
	try
	{
		Func();
	}
	catch (const char* errmsg)
	{
		cout << errmsg << endl;
	}
	catch (const exception& e)
	{
		cout << e.what() << endl;
	}
	catch (...)
	{
		cout << "未知异常" << endl;
	}
	return 0;
}